package com.flying.list;

import org.junit.Test;

import java.util.LinkedList;
import java.util.List;

/**
 * @author 刘鹏飞
 * @ClassName LinkedListTest
 * @Date 2024/12/30 23:26
 * @Created by 刘鹏飞
 * @Description 测试LinkedList
 */
public class LinkedListTest {

    /**
     *         // 使用 List作为对象引用类型
     */
    @Test
    public void test1(){

        List<String> list = new LinkedList<>();

        //  添加元素
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("e");

        for (String s : list) {
            System.out.print(s + "\t");
        }

        // 删
        String remove = list.remove(1);
        System.out.println("remove = " + remove);

        for (String s : list) {
            System.out.print(s + "\t");
        }

        // 改

        String change = list.set(2, "hello");
        System.out.println("change = " + change);

        for (String s : list) {
            System.out.print(s + "\t");
        }



        // 查
        String s = list.get(1);
        System.out.println("s = " + s);


        // 获取容器中所有元素
        list.forEach(System.out::println);



    }


    /**
     * 使用LinkedList的特性方法
     */

    @Test
    public void test2(){

        LinkedList<String> list=new LinkedList<>();

        // 增
        // 1. 将指定元素插入到开头
        list.addFirst("a");
        list.addFirst("b");
        list.addFirst("c");
        list.addFirst("d");
        list.addFirst("e");

        for (String s : list) {
            System.out.print(s+"\t");
        }
        System.out.println("\n");
        System.out.println("================将元素插入到结尾================");
        // 2. 将元素插入到结尾
        LinkedList<String> list1=new LinkedList<>();

        list1.addLast("a");
        list1.addLast("b");
        list1.addLast("c");
        list1.addLast("d");
        list1.addLast("e");
        for (String s : list1) {
            System.out.print(s+"\t");
        }
        System.out.println();





        // 查
        // 返回链表中的第一个元素
        System.out.println(list1.getFirst());
        // 返回链表中的最后一个元素
        System.out.println(list1.getLast());



        //  删
        // 移除此链表中的第一个元素
//        list1.removeFirst();
//        // 移除此链表中最后一个元素
//        list.removeLast();

        // 弹出第一个元素,并将被弹出的元素返回, 方法内部:removeFirst();
        String pop = list1.pop();

        // 建一个元素推入此链表的头部  方法内部: addFirst(e);
        list1.push("pp");



        // peek()  和 poll()    --- 用于队列操作
        /*
        与poll()方法比较：poll()方法也用于获取并删除链表的头部元素。
        如果链表为空，poll()返回null。而peek()只是查看头部元素，不会删除它。
        例如，如果连续两次调用peek()，返回的都是链表的第一个元素；
        但如果连续两次调用poll()，第二次调用可能返回null（如果链表在第一次调用后只有一个元素）。
        与getFirst()方法比较：getFirst()方法也用于获取链表的第一个元素。
        但是当链表为空时，getFirst()会抛出NoSuchElementException异常，而peek()返回null。
        所以peek()在处理可能为空的链表时更加安全
         */



        LinkedList<String> l2=new LinkedList<>();
        l2.add("哈哈");

         // System.out.println(l2.getFirst()); // NoSuchElementException
        String peek = l2.peek();
        System.out.println();  // 哈哈

        System.out.println(l2.poll());  // 哈哈
        System.out.println(l2.poll());  // null

    }
}
